#define _CRT_SECURE_NO_WARNINGS 1

#include<iostream>
#include<memory>
#include<stdio.h>
#include <stdlib.h>
using namespace std;

// template<class T>
// class SmartPtr {
// public:
// 	SmartPtr(T* ptr = nullptr)
// 		: _ptr(ptr)
// 	{}
// 	~SmartPtr()
// 	{
// 		if (_ptr)
// 			delete _ptr;
// 	}
// 	T& operator*() { return *_ptr; }
// 	T* operator->() { return _ptr; }
// private:
// 	T* _ptr;
// };

struct Date
{
	int _year;
	int _month;
	int _day;

	Date(int year = 1, int month = 1, int day = 1)
		:_year(year)
		,_month(month)
		,_day(day)
	{}

	~Date()
	{
		cout << "~Date()" << endl;
	}
};

// // int main()
// // {
// // 	/*SmartPtr<Date> sp1(new Date);
// // 	SmartPtr<Date> sp2(sp1);*/
// // 	auto_ptr<Date> ap1(new Date);
// // 	// 拷贝时，管理权限转移，被拷贝悬空
// // 	auto_ptr<Date> ap2(ap1);

// // 	ap1->_year++;


// // 	return 0;
// // }




// int main()
// {
// 	// C++11
// 	unique_ptr<Date> up1(new Date);
// 	// 不支持拷贝
// 	//unique_ptr<Date> up2(up1);
	
// 	//vector<shared_ptr<Date>> v;
// 	shared_ptr<Date> sp1(new Date);
// 	shared_ptr<Date> sp2(sp1);
// 	shared_ptr<Date> sp3(sp2);
// 	cout << sp1.use_count() << endl;

// 	return 0;
// }



// template<class T>
// class SmartPtr {
// public:
// 	SmartPtr(T* ptr = nullptr)
// 		: _ptr(ptr)
// 	{}
// 	~SmartPtr()
// 	{
// 		if (_ptr)
// 			delete _ptr;
// 	}
// 	T& operator*() { return *_ptr; }
// 	T* operator->() { return _ptr; }
// private:
// 	T* _ptr;
// };

// struct Date
// {
// 	int _year;
// 	int _month;
// 	int _day;

// 	Date(int year = 1, int month = 1, int day = 1)
// 		:_year(year)
// 		,_month(month)
// 		,_day(day)
// 	{}

// 	~Date()
// 	{
// 		cout << "~Date()" << endl;
// 	}
// };


// template<class T>
// class DeleteArray
// {
// public:
// 	void operator()(T* ptr)
// 	{
// 		delete[] ptr;
// 	}
// };

class Fclose
{
public:
	void operator()(FILE* ptr)
	{
		cout << "fclose:" << ptr << endl;
		fclose(ptr);
	}
};

// int main()
// {

// 	//// 定制删除器
// 	unique_ptr<Date, DeleteArray<Date>> up2(new Date[5]);
// 	unique_ptr<Date[]> up2(new Date[5]);
// 	unique_ptr<FILE, Fclose> up3(fopen("test.cpp", "r"));

// 	vector<shared_ptr<Date>> v;
// 	shared_ptr<Date> sp1(new Date);
// 	shared_ptr<Date> sp2(sp1);
// 	shared_ptr<Date> sp3(sp2);
// 	cout << sp1.use_count() << endl;

// 	shared_ptr<Date[]> sp4(new Date[5]);
// 	shared_ptr<FILE> sp5(fopen("test.cpp", "r"), Fclose());

// 	shared_ptr<Date> sp6 = make_shared<Date>(2024, 8, 5);

// 	return 0;
// }

///////////////////////////////////////////////////////////////////////
// 
#include"shared_ptr.h"

// int main()
// {
// 	ltw::shared_ptr<Date> sp1(new Date);
// 	ltw::shared_ptr<Date> sp2(sp1);
// 	ltw::shared_ptr<Date> sp3(new Date);

// 	// 自己给自己赋值
// 	sp3 = sp3;
// 	sp1 = sp2;

// 	sp1 = sp3;
// 	sp2 = sp3;

// 	ltw::shared_ptr<FILE> sp5(fopen("test.cpp", "r"), Fclose());
// 	ltw::shared_ptr<int> sp6((int*)malloc(40), [](int* ptr) 
// 		{
// 			cout << "free:" << ptr << endl;
// 			free(ptr);
// 		});


// 	return 0;
// }




struct ListNode
{
	int _data;

	// ltw::shared_ptr<ListNode> _next;
	// ltw::shared_ptr<ListNode> _prev;

	ltw::weak_ptr<ListNode> _next;
	ltw::weak_ptr<ListNode> _prev;

	~ListNode()
	{
		cout << "~ListNode()" << endl;
	}
};



// int main()
// {
// 	// 循环引用 -- 内存泄露
// 	ltw::shared_ptr<ListNode> n1(new ListNode);
// 	ltw::shared_ptr<ListNode> n2(new ListNode);

// 	cout << n1.use_count() << endl;
// 	cout << n2.use_count() << endl;

// 	n1->_next = n2;
// 	n2->_prev = n1;

// 	cout << n1.use_count() << endl;
// 	cout << n2.use_count() << endl;

// 	// weak_ptr不支持管理资源，不支持RAII
// 	//std::weak_ptr<ListNode> wp(new ListNode);

// 	return 0;
// }






int main()
{
	std::weak_ptr<ListNode> wp;
	std::shared_ptr<ListNode> sp;

	{
		std::shared_ptr<ListNode> n1(new ListNode);
		wp = n1;
		cout << wp.expired() << endl;
		n1->_data++;
		sp = wp.lock();
	}
	cout << wp.expired() << endl;

	return 0;
}


// int main()
// {
// 	char* ptr = new char[1024 * 1024 * 1024];
// 	cout << (void*)ptr << endl;

// 	return 0;
// }